package com.tanhua.admin.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.tanhua.admin.interceptor.AdminHolder;
import com.tanhua.admin.service.AdminService;
import com.tanhua.commons.utils.Constants;
import com.tanhua.model.db.Admin;
import com.tanhua.model.vo.AdminVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

@RestController
@RequestMapping("/system/users")
public class SystemController {

    @Autowired
    private AdminService adminService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 获取验证码图片
     *    get verification
     *  请求参数：
     *      query ：uuid
     *  问题：是否需要返回值，不需要返回值（json，页面）
     *  直接以响应流输出
     */
    @GetMapping("/verification")
    public void verification(String uuid, HttpServletResponse response) throws IOException {
        //在hutool工具中，具有一个生成验证码图片的工具类
        //1、生成一个带有图片的验证码对象   （图片数据流，验证码数据）
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(299, 97);//指定图片的长，宽
        //2、将验证码数据存入到redis中
        String code = captcha.getCode();
        redisTemplate.opsForValue().set(Constants.CAP_CODE+uuid,code);
        //3、已数据流响应
        captcha.write(response.getOutputStream()); //将图片数据写入到响应的输出流中
    }

    /**
     * 管理员登录：
     *    Post  /login
     *    参数：
     *      Body
     *       username,password,verificationCode,uuid
     *    返回值
     *       Map<token,"xxxx">
     */
    @PostMapping("/login")
    public ResponseEntity login(@RequestBody Map map) {
        //1、获取参数
        String username = (String) map.get("username");
        String password = (String) map.get("password");
        String verificationCode = (String) map.get("verificationCode");
        String uuid = (String) map.get("uuid");
        //2、调用service登录
        Map retMap = adminService.login(username,password,verificationCode,uuid);
        //3、返回值
        return ResponseEntity.ok(retMap);
    }

    /**
     * 获取管理员身份信息
     *  POST     /profile
     * 在今天tanhua-admin模块中，已经通过拦截器结合Threadlocal了token
     * 将数据解析号之后存入到Threadloca中，可以通过工具类直接获取  AdminHolder
     */
    @PostMapping("/profile")
    public ResponseEntity profile() {
        //1、调用service查询当前用户数数据
        Admin admin = adminService.findById(AdminHolder.getUserId());
        //2、构造vo对象
        AdminVo vo = AdminVo.init(admin);
        return ResponseEntity.ok(vo);
    }
}
